package com.utils.redis.list;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

import java.util.*;

/**
 * @author xin.ding
 * @date 2020/9/22 15:09
 */
public class RedisListTest {

    public static void main(String[] args) {
        pipeCompare();
    }
    public static void pipeCompare() {
        Jedis redis = new Jedis("localhost", 6379);
//        redis.auth("redis");
        Map<String, String> data = new HashMap<>(16);
        //使用第0个库
        redis.select(0);
        //清空第8个库所有数据
        redis.flushDB();
        long start = System.currentTimeMillis();
        // 直接hmset
        for (int i = 0; i < 10000; i++) {
            data.clear();
            data.put("k_" + i, "v_" + i);
            //循环执行10000条数据插入redis
            redis.hmset("key_" + i, data);
        }
        long end = System.currentTimeMillis();
        System.out.println("    共插入:[" + redis.dbSize() + "]条 .. ");
        System.out.println("1,未使用PIPE批量设值耗时" + (end - start) / 1000 + "秒..");

        redis.select(0);
        redis.flushDB();
        // 使用pipeline hmset
        Pipeline pipe = redis.pipelined();
        start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            data.clear();
            data.put("k_" + i, "v_" + i);
            //将值封装到PIPE对象，此时并未执行，还停留在客户端
            pipe.hmset("key_" + i, data);
        }
        //将封装后的PIPE一次性发给redis
        pipe.sync();
        end = System.currentTimeMillis();
        System.out.println("    PIPE共插入:[" + redis.dbSize() + "]条 .. ");
        System.out.println("2,使用PIPE批量设值耗时" + (end - start) / 1000 + "秒 ..");
//--------------------------------------------------------------------------------------------------
        //将上面设值所有结果键查询出来
        // hmget
        Set<String> keys = redis.keys("key_*");
        // 直接使用Jedis hgetall
        start = System.currentTimeMillis();
        Map<String, Map<String, String>> result = new HashMap<>();
        for (String key : keys) {
            //此处keys根据以上的设值结果，共有10000个，循环10000次
            //使用redis对象根据键值去取值，将结果放入result对象
            result.put(key, redis.hgetAll(key));
        }
        end = System.currentTimeMillis();
        System.out.println("    共取值:[" + redis.dbSize() + "]条 .. ");
        System.out.println("3,未使用PIPE批量取值耗时 " + (end - start) / 1000 + "秒 ..");

        // 使用pipeline hgetall
        result.clear();
        start = System.currentTimeMillis();
        for (String key : keys) {
            //使用PIPE封装需要取值的key,此时还停留在客户端，并未真正执行查询请求
            pipe.hgetAll(key);
        }
        //提交到redis进行查询
        pipe.sync();

        end = System.currentTimeMillis();
        System.out.println("    PIPE共取值:[" + redis.dbSize() + "]条 .. ");
        System.out.println("4,使用PIPE批量取值耗时" + (end - start) / 1000 + "秒 ..");

        redis.disconnect();
    }

//
//    public static void main(String[] args) {
//        Jedis jedis = null;
//        String listName = "test";
//        String redisHost = "redis01";
//        String redisPwd = "redis";
//        int redisPort = 6379;
//        int i = 0;
//        Long begin = Calendar.getInstance().getTimeInMillis();
//        try {
//            List list=new ArrayList();
//            //获取jedis连接
//            jedis = JedisUtil.getDataJedis(redisHost, redisPort, redisPwd);
//            while (true) {
//                //从List批量获取数据，每次取200条
//                list = jedis.lrange(listName,0,199);
//                int num=list.size();
//                if(num == 0){
//                    Thread.sleep(1000);
//                    continue;
//                }
//                System.out.println("从list获取到"+num+"条数据");
//                //将list做修剪，去掉已经读出的数据
//                jedis.ltrim(listName,num,-1);
//                i+=num;
//                if (i>10000){
//                    break;
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }finally {
//            if (jedis!=null){
//                jedis.close();
//            }
//        }
//        Long end = Calendar.getInstance().getTimeInMillis();
//        System.out.println("读取"+i+"条共耗时：[" + (end-begin)+"]ms");
//    }

}
